﻿#ifndef FITKVAONEHDF5BASE_H
#define FITKVAONEHDF5BASE_H

#include "FITK_Interface/FITKInterfaceIO/FITKAbstractHDF5Reader.h"
#include <vector>
#include "FITKVAOneHDF5IOAPI.h"

namespace H5
{
    class H5File;
}

namespace VAOne
{
    class FITKVAOneHDF5IO_API FITKVAOneHDF5Base
    {
    public:
        explicit  FITKVAOneHDF5Base() = default;

        virtual ~FITKVAOneHDF5Base() = default;

    protected:
        /**
         * @brief 获取数据集下数据
         * @param[i]   groupPath 组名
         * @param[i]   dataSetName 数据集成
         * @param[o]   dataVector 返回数据
         * @param[i]   h5File h5数据对象
         * @return
         * @author  WangZhenYu (wangzhenyu@diso.cn)
         * @date    2024-11-23
         */
        bool getData(std::string groupPath, std::string dataSetName, std::vector<float>& dataVector, H5::H5File* h5File);


        /**
         * @brief 获取某个组下的子组列表
         * @param[i]   parentgroupName 父节点组名
         * @param[o]   grouplists 子列列表
         * @param[i]   h5File h5数据对象
         * @author  WangZhenYu (wangzhenyu@diso.cn)
         * @date    2024-11-23
         */
        void getGroupChildrenNames(const std::string& parentgroupName, std::vector<std::string>& grouplists,H5::H5File* h5File);

        /**
         * @brief 获取某组下所有数据项的名字列表
         * @param[i]   parentgroupName  父节点组名
         * @param[i]   h5File h5数据对象
         * @return
         * @author  WangZhenYu (wangzhenyu@diso.cn)
         * @date    2024-11-23
         */
        std::vector<std::string> getGroupDataSetNames(const std::string& parentgroupName, H5::H5File* h5File);
        /**
         * @brief 源字符串中是否包含某个字符串
         * @param[i]   sourcestr 源字符串
         * @param[i]   findstr 查找字符串
         * @return
         * @author  WangZhenYu (wangzhenyu@diso.cn)
         * @date    2024-11-23
         */
        bool contains(const std::string& sourcestr, const std::string& findstr);

        /**
         * @brief 合并字符串
         * @param[i]   left 左侧字符串如组名
         * @param[i]   right 右侧字符串如数据集成
         * @param[i]   separator 分割符
         * @param[o]   result 拼接后字符串
         * @author  WangZhenYu (wangzhenyu@diso.cn)
         * @date    2024-11-23
         */
        void combine(const std::string& left, const std::string& right, char separator, std::string& result);

        bool readStrAttribute(std::string parentgroupdname, std::string name, std::string& str, H5::H5File* h5File);
        float readFloatAttribute(std::string parentgroupdname, std::string name, H5::H5File* h5File, bool* b = nullptr);
        int readIntAttribute(std::string parentgroupdname, std::string name, H5::H5File* h5File, bool* b = nullptr);;
        bool readBoolAttribute(std::string parentgroupdname, std::string name, H5::H5File* h5File, bool* b = nullptr);

    };



}

#endif // FITKVAONEHDF5BASE_H
